package top.tenebrous.yzl.im.interceptor;

import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import top.tenebrous.yzl.im.message.Message;
import top.tenebrous.yzl.im.message.MessageBody;

import java.util.HashMap;
import java.util.Map;

/**
 * @Classname ImWebsocketInterceptor
 * @Description im拦截器，可以在websocket 握手前后进行请求拦截 以此来实现功能扩展
 * 常用扩展：鉴权，hearder设置，参数设置等
 * @Date 2023/11/12 12:01 PM
 * @Created by zhangya
 */
public interface ImWebsocketInterceptor {

  /**
   * 拦截器拦截
   * 传递userId，可通过userId，将所需要的数据，以key-value的形式进行上下文传递
   */
  default Map<String, Object> afterImWebSocketInterceptorProcessor(String userId){
    return new HashMap<>();
  };

  /**
   * 握手前置拦截
   * 可以通过握手时的session，做一些扩展操作
   * 比如权限校验
   */
  default void beforeImWebSocketOpenProcessor(WebSocketSession session) {};

  /**
   * 握手后置拦截
   * 可以通过握手时的session，做一些扩展操作
   * 比如权限校验
   */
  default void afterImWebSocketOpenProcessor(WebSocketSession session) {};

  /**
   * 消息前置拦截
   * 服务端接收到消息后进行拦截，可以扩展为日志记录，消息修改
   */
  default void beforeImWebSocketOnMessageProcessor(String userId, MessageBody message) {
  };

  /**
   * 消息后置拦截
   */
  default void afterImWebSocketOnMessageProcessor(String userId, MessageBody message) {
  };

  /**
   * 客户端连接关闭后置处理
   */
  default void afterImWebSocketOnCloseProcessor(WebSocketSession session, CloseStatus status) {
  };

  /**
   * 解析消息前处理
   * @param data
   */
  default String beforeImWebSocketOnParseMessageProcessor(String data) {
    return data;
  };

  /**
   * 发送文本消息前处理
   * 只处理私聊 && 公聊俩种
   * @param content
   */
  default String beforeImWebSocketOnSendProcessor(String content) {
    return content;
  };
}
